package com.power.powercash;

import com.db4o.query.Predicate;
import com.power.utils.Date;

/**
 *
 * @author Juno
 */
public class ConsultaCartao extends Predicate<CartaoCredito> {

  private CartaoCredito cartao;

  private boolean empty;


  public ConsultaCartao()
  {
    cartao = null;
    empty = false;
  }


  public ConsultaCartao(CartaoCredito cartao)
  {
    this.cartao = cartao;
    empty = false;
  }


  public CartaoCredito getCartao() {
    return cartao;
  }


  public void setCartao(CartaoCredito cartao) {
    this.cartao = cartao;
  }


  public void setEmptyQuery(boolean emptyQuery)
  {
    empty = emptyQuery;
  }


  public boolean isEmptyQuery()
  {
    return empty;
  }


  @Override
  public boolean match(CartaoCredito c) {
    if(c == null) return false;
    if(cartao == null) return false;

    if(empty) return true;

    boolean bandeira = false, banco = false, 
        numero = false, nonnull = false, vencto = false;

    if(cartao.getBandeira() != null
        && c.getBandeira() != null
        && cartao.getBandeira().equals(c.getBandeira())) {
      bandeira = true;
      nonnull = true;
    } else if(cartao.getBandeira() == null)
      bandeira = true;

    if(cartao.getBanco() != null
        && c.getBanco() != null
        && new ConsultaBanco(
        cartao.getBanco()).match(c.getBanco())) {
      banco = true;
      nonnull = true;
    } else if(cartao.getBanco() == null)
      banco = true;

    if(cartao.getNumero() > 0
        && c.getNumero() > 0
        && cartao.getNumero() == c.getNumero()) {
      numero = true;
      nonnull = true;
    } else if(cartao.getNumero() <= 0)
      numero = true;

    if(cartao.getVencimento() > 0
        && c.getVencimento() > 0
        && cartao.getVencimento() == c.getVencimento()) {
      vencto = true;
      nonnull = true;
    } else if(cartao.getNumero() <= 0)
      vencto = true;

    return nonnull && numero && bandeira && banco && vencto;
  }


  public static void main(String[] args)
  {
    ConsultaCartao cc = new ConsultaCartao();

    CartaoCredito c = new CartaoCredito(
        2000, "VISA", 23, new Date(),
        new Banco("BB", 1, 1));
    System.out.println(c);
    System.out.println();

    CartaoCredito c1 = new CartaoCredito();
    c1.setBanco(new Banco("BB", 1, 1));
    System.out.println(c1);
    CartaoCredito c2 = new CartaoCredito();
    c2.setBandeira("VISA");
    System.out.println(c2);
    CartaoCredito c3 = new CartaoCredito();
    c3.setNumero(2000);
    System.out.println(c3);

    cc.setCartao(c1);
    System.out.println("cc.match(c): "+ cc.match(c));
    cc.setCartao(c2);
    System.out.println("cc.match(c): "+ cc.match(c));
    cc.setCartao(c3);
    System.out.println("cc.match(c): "+ cc.match(c));
  }

}
